package cn.com.mayue.guava.reflect;

import cn.com.mayue.guava.Person;
import com.google.common.collect.Lists;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.junit.Test;

import java.util.List;

/**
 * Created by mayue
 * TypeToken 测试
 * dk类在runtime时不为对象保存类型信息，但是TypeToken却可在运行时获取类型
 * gson 中也有这个类
 */
public class TypeTokenTest {
    @Test
    public void testTypeToken() {
        List<String> stringList = Lists.newArrayList();
        List<Integer> intList = Lists.newArrayList();
        List<Person> personList = Lists.newArrayList();
        System.out.println("stringList type is " + stringList.getClass());
        System.out.println("intList type is " + intList.getClass());
        // 类型被擦除了 已分不清int string
        // 使用isAssignableFrom()是用来判断一个类和另一个类是否相同或是另一个类的子类或接口
        System.out.println(stringList.getClass().isAssignableFrom(intList.getClass()));
        System.out.println(stringList.getClass().isAssignableFrom(personList.getClass()));
        // 利用TypeToken解析原来的类型
        TypeToken<List<String>> typeToken = new TypeToken<List<String>>() {};
        TypeToken<?> genericType = typeToken.resolveType(List.class.getTypeParameters()[0]);
        System.out.println(genericType.getType());
        //获取运行时类
//        System.out.println(genericType.getRawType());

        TypeToken<List<Person>> typeTokenPerson = new TypeToken<List<Person>>() {};
        TypeToken<?> genericTypePerson = typeTokenPerson.resolveType(List.class.getTypeParameters()[0]);
        System.out.println(genericTypePerson.getType());
    }
}
